home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / manchest.lha / MANCHESTER / manchester / 2.2 / New-Bit-Editor.st < prev    next >
Text File  |  1993-07-24  |  15KB  |  509 lines

  1. "    NAME        New-Bit-Editor
  2.     AUTHOR        tph@cs.man.ac.uk
  3.     FUNCTION much improved 
  4.     ST-VERSIONS    2.2
  5.     PREREQUISITES     
  6.     CONFLICTS    
  7.     DISTRIBUTION      world
  8.     VERSION        1.1
  9.     DATE    22 Jan 1989
  10. SUMMARY    New-Bit-Editor
  11.     is a new, improved (or at least different :-)
  12.    version of the bit editor.  In fact, it has been completely
  13.    re-written, rather more cleanly (IMHO).
  14.  
  15.    This    version allows you to set and reset pixels with the red and
  16.    yellow buttons respectively, has buttons (rather than a pop-up
  17.    menu) for save (accept) and undo (cancel), displays a grid (if the
  18.    scale factor is large enough), and displays the pixels in `gray'
  19.    (so that you don't lose the croshair cursor all the time).  Editing
  20.    OpaqueForms is also supported, and you can set the `colour' (black,
  21.    white or transparent) associated with the red and yellow buttons.
  22.    A `full colour' version is due RSN.
  23.  
  24.    Comments would be appreciated.  TPH, 8/7/89.(2.2)
  25. "!
  26. Model subclass: #NewBitEditor
  27.     instanceVariableNames: 'form backupForm redButtonColor yellowButtonColor '
  28.     classVariableNames: ''
  29.     poolDictionaries: ''
  30.     category: 'New Bit Editor'!
  31. NewBitEditor comment:
  32. 'I represent a `holder'' for a form being edited.  I keep a backup
  33. form, upon which changes are actually made, so that save and
  34. restore operations can be performed.'!
  35.  
  36.  
  37. !NewBitEditor methodsFor: 'initialize-release'!
  38.  
  39. initialize
  40.     "Initialize the red and yellow button colors."
  41.  
  42.     redButtonColor _ 1.
  43.     yellowButtonColor _ 0.! !
  44.  
  45. !NewBitEditor methodsFor: 'accessing'!
  46.  
  47. backupForm
  48.     "Answer with the (backup) form being edited."
  49.  
  50.     ^backupForm!
  51.  
  52. form
  53.     "Answer with the (real) form being edited."
  54.  
  55.     ^form!
  56.  
  57. pixelAt: aPoint
  58.     "Get the pixel at aPoint."
  59.  
  60.     ^backupForm valueAt: aPoint!
  61.  
  62. redButtonColor
  63.     ^redButtonColor!
  64.  
  65. redButtonColor: aValue
  66.     redButtonColor _ aValue!
  67.  
  68. setPixelAt: aPoint to: aValue
  69.     "Set the pixel at aPoint to aValue."
  70.  
  71.     (backupForm valueAt: aPoint) = aValue ifFalse: [
  72.         backupForm valueAt: aPoint put: aValue.
  73.         self changed: aPoint.
  74.         backupForm changed]!
  75.  
  76. yellowButtonColor
  77.     ^yellowButtonColor!
  78.  
  79. yellowButtonColor: aValue
  80.     yellowButtonColor _ aValue! !
  81.  
  82. !NewBitEditor methodsFor: 'form manipulation'!
  83.  
  84. restore
  85.     "Restore the backup form from the (real) form."
  86.  
  87.     backupForm become: form deepCopy.
  88.     backupForm changed.
  89.     self changed: #all!
  90.  
  91. save
  92.     "Save the backup form on the (real) form."
  93.  
  94.     form become: backupForm.
  95.     backupForm become: form deepCopy! !
  96.  
  97. !NewBitEditor methodsFor: 'private'!
  98.  
  99. setForm: aForm
  100.  
  101.     form _ aForm.
  102.     backupForm _ aForm deepCopy! !
  103. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  104.  
  105. NewBitEditor class
  106.     instanceVariableNames: ''!
  107.  
  108.  
  109. !NewBitEditor class methodsFor: 'instance creation'!
  110.  
  111. new
  112.     "Answer with a new initialized instance of the receiver."
  113.  
  114.     ^super new initialize!
  115.  
  116. on: aForm
  117.     "Answer with a new instance of the receiver on aForm."
  118.  
  119.     ^self new setForm: aForm! !
  120.  
  121. MouseMenuController subclass: #NewBitEditorController
  122.     instanceVariableNames: ''
  123.     classVariableNames: ''
  124.     poolDictionaries: ''
  125.     category: 'New Bit Editor'!
  126. NewBitEditorController comment:
  127. 'I am a controller for a simple bit-oriented form editor.  I handle
  128. input from red and yellow buttons, and pass it over to my model.'!
  129.  
  130.  
  131. !NewBitEditorController methodsFor: 'basic control sequence'!
  132.  
  133. controlInitialize
  134.     "Change the cursor when starting."
  135.  
  136.     Cursor crossHair show!
  137.  
  138. controlTerminate
  139.     "Restore the cursor when stoping."
  140.  
  141.     Cursor normal show! !
  142.  
  143. !NewBitEditorController methodsFor: 'control defaults'!
  144.  
  145. isControlActive
  146.  
  147.     ^(view containsPoint: sensor cursorPoint) and: [sensor blueButtonPressed not]! !
  148.  
  149. !NewBitEditorController methodsFor: 'button actions'!
  150.  
  151. redButtonActivity
  152.     "When the red button is pressed, determine the location of the  
  153.      cursor, and set the corresponding pixel in the model's (backup) form."
  154.  
  155.     model
  156.         setPixelAt: sensor cursorPoint -
  157.             (view insetDisplayBox topLeft) // view scaleFactor
  158.         to: model redButtonColor!
  159.  
  160. yellowButtonActivity
  161.     "When the yellow button is pressed, determine the location of the  
  162.      cursor, and set the corresponding pixel in the model's (backup) form."
  163.  
  164.     model
  165.         setPixelAt: sensor cursorPoint -
  166.             (view insetDisplayBox topLeft) // view scaleFactor
  167.         to: model yellowButtonColor! !
  168.  
  169. View subclass: #NewBitEditorView
  170.     instanceVariableNames: 'scaleFactor blackForm whiteForm transparentForm maskForm '
  171.     classVariableNames: ''
  172.     poolDictionaries: ''
  173.     category: 'New Bit Editor'!
  174. NewBitEditorView comment:
  175. 'I am a View on a form being edited.  I know the scale factor
  176. being used, and retain various mask forms in improve the performance
  177. of the display.'!
  178.  
  179.  
  180. !NewBitEditorView methodsFor: 'accessing'!
  181.  
  182. blackForm
  183.     "Answer with an appropriate black form of displaying."
  184.  
  185.     blackForm isNil ifTrue: [
  186.         blackForm _ (Form extent: scaleFactor) gray.
  187.         blackForm black: ((scaleFactor x - 1) @ 0 corner: scaleFactor).
  188.         blackForm black: (0 @ (scaleFactor y - 1) corner: scaleFactor)].
  189.     ^blackForm!
  190.  
  191. maskForm
  192.  
  193.     | lineForm |
  194.     maskForm isNil ifTrue: [
  195.         maskForm _ Form extent: self insetDisplayBox extent.
  196.         lineForm _ Form extent: scaleFactor.
  197.         lineForm black: ((scaleFactor x - 1) @ 0 corner: scaleFactor).
  198.         lineForm black: (0 @ (scaleFactor y - 1) corner: scaleFactor).
  199.         (InfiniteForm with: lineForm) displayOn: maskForm].
  200.     ^maskForm!
  201.  
  202. scaleFactor
  203.     "Answer with the scaleFactor."
  204.  
  205.     ^scaleFactor!
  206.  
  207. transparentForm
  208.     "Answer with an appropriate `transparent' form for displaying."
  209.  
  210.     transparentForm isNil ifTrue: [
  211.         transparentForm _ (Form extent: scaleFactor) veryLightGray.
  212.         transparentForm black: ((scaleFactor x - 1) @ 0 corner: scaleFactor).
  213.         transparentForm black: (0 @ (scaleFactor y - 1) corner: scaleFactor)].
  214.     ^transparentForm!
  215.  
  216. whiteForm
  217.     "Answer with an appropriate white form of displaying."
  218.  
  219.     whiteForm isNil ifTrue: [
  220.             whiteForm _ Form extent: scaleFactor.
  221.             whiteForm black: (scaleFactor x - 1 @ 0 corner: scaleFactor).
  222.             whiteForm black: (0 @ (scaleFactor y - 1) corner: scaleFactor)].
  223.     ^whiteForm! !
  224.  
  225. !NewBitEditorView methodsFor: 'controller access'!
  226.  
  227. defaultControllerClass
  228.  
  229.     ^NewBitEditorController! !
  230.  
  231. !NewBitEditorView methodsFor: 'displaying'!
  232.  
  233. displayForm
  234.     "The model holds a Form.  Display it appropriately."
  235.  
  236.     (model backupForm magnifyBy: scaleFactor)
  237.         displayOn: Display
  238.         at: self insetDisplayBox topLeft
  239.         clippingBox: self insetDisplayBox
  240.         rule: Form over
  241.         mask: Form gray!
  242.  
  243. displayFormAt: aPoint
  244.     "Update the display at aPoint."
  245.  
  246.     | tempForm |
  247.     (model pixelAt: aPoint) = 0
  248.         ifTrue: [tempForm _ self whiteForm].
  249.     (model pixelAt: aPoint) = 1
  250.         ifTrue: [tempForm _ self blackForm].
  251.     (model pixelAt: aPoint) = 2
  252.         ifTrue: [tempForm _ self transparentForm].
  253.     tempForm notNil ifTrue: [
  254.         tempForm
  255.             displayOn: Display
  256.             at: (self insetDisplayBox origin + (scaleFactor * aPoint))
  257.             clippingBox: self insetDisplayBox
  258.             rule: Form over
  259.             mask: Form black]!
  260.  
  261. displayGrid
  262.     "Display the grid appropriately."
  263.  
  264.     self maskForm
  265.             displayOn: Display
  266.             at: self insetDisplayBox topLeft
  267.             clippingBox: self insetDisplayBox
  268.             rule: Form paint
  269.             mask: Form black!
  270.  
  271. displayOpaqueForm
  272.     "The model holds an OpaqueForm.  Display it appropriately."
  273.  
  274.     | tempForm |
  275.     tempForm _ Form extent: self insetDisplayBox extent.
  276.     (InfiniteForm with: Form veryLightGray) displayOn: tempForm.
  277.     tempForm
  278.         displayOn: Display
  279.         at: self insetDisplayBox origin
  280.         clippingBox: self insetDisplayBox
  281.         rule: Form over
  282.         mask: Form black.
  283.     (model backupForm shape magnifyBy: scaleFactor)
  284.         displayOn: Display
  285.         at: self insetDisplayBox topLeft
  286.         clippingBox: self insetDisplayBox
  287.         rule: Form erase
  288.         mask: Form black.
  289.     (model backupForm figure magnifyBy: scaleFactor)
  290.         displayOn: Display
  291.         at: self insetDisplayBox topLeft
  292.         clippingBox: self insetDisplayBox
  293.         rule: Form under
  294.         mask: Form gray!
  295.  
  296. displayView
  297.     "Display the model appropriately."
  298.  
  299.     (model backupForm isKindOf: OpaqueForm)
  300.         ifTrue: [self displayOpaqueForm]
  301.         ifFalse: [self displayForm].
  302.     scaleFactor > (5@5) ifTrue: [self displayGrid]! !
  303.  
  304. !NewBitEditorView methodsFor: 'updating'!
  305.  
  306. update: aParameter
  307.     "Ignore aParameter, and re-display the view."
  308.  
  309.     aParameter == #all ifTrue: [^self display].
  310.     (aParameter isKindOf: Point) ifTrue: [self displayFormAt: aParameter].! !
  311.  
  312. !NewBitEditorView methodsFor: 'private'!
  313.  
  314. setScaleFactor: aPoint
  315.  
  316.     scaleFactor _ aPoint.! !
  317. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  318.  
  319. NewBitEditorView class
  320.     instanceVariableNames: ''!
  321.  
  322.  
  323. !NewBitEditorView class methodsFor: 'instance creation'!
  324.  
  325. openOn: aForm 
  326.     "Create and schedule a new instance of the receiver, using a
  327.      default magnification factor."
  328.  
  329.     "NewBitEditorView openOn: Form fromUser."
  330.     "NewBitEditorView openOn: Cursor crossHair."
  331.     "NewBitEditorView openOn: (OpaqueForm shape: Cursor normal deepCopy)."
  332.  
  333.     self openOn: aForm withMagnification: 8@8!
  334.  
  335. openOn: aForm withMagnification: aPoint 
  336.     "Create and schedule a new instance of the receiver."
  337.     "NewBitEditorView openOn: (Form extent: 40@40) withMagnification: (6@6). "
  338.     "NewBitEditorView openOn: (Cursor wait) withMagnification: (8@8)."
  339.     "NewBitEditorView openOn: Form fromUser withMagnification: (10@10)."
  340.     "NewBitEditorView openOn: OpaqueForm makeStar."
  341.  
  342.     | topView extra size topSize editor bitView buttonView |
  343.     topView _ StandardSystemView new label: 'Bit Editor'.
  344.     size _ aForm extent * aPoint + (2@2).
  345.     extra _ (aForm isKindOf: OpaqueForm)
  346.                 ifTrue: [100 max: aForm extent x + 20]
  347.                 ifFalse: [50 max: aForm extent x + 10].
  348.     topSize _ size + (extra @ 0).
  349.     editor _ NewBitEditor on: aForm.
  350.  
  351.     topView minimumSize: topSize.
  352.     topView maximumSize: topSize.
  353.     topView borderWidth: 1.
  354.     topView borderColor: Form black.
  355.     topView window: (0@0 extent: topSize).
  356.     topView insideColor: Form white.
  357.  
  358.     buttonView _ View new borderWidth: 1.
  359.     buttonView model: editor.
  360.     buttonView borderColor: Form black.
  361.     buttonView insideColor: Form lightGray.
  362.     topView
  363.         addSubView: buttonView
  364.         window: (size x @ 0 corner: topSize)
  365.         viewport: (size x @ 0 corner: topSize).
  366.     (aForm isKindOf: OpaqueForm)
  367.         ifTrue: [self addOpaqueFormSubViewsTo: buttonView]
  368.         ifFalse: [self addFormSubViewsTo: buttonView].
  369.  
  370.     bitView _ self new model: editor.
  371.     bitView borderWidth: 1.
  372.     bitView borderColor: Form black.
  373.     bitView setScaleFactor: aPoint.
  374.     topView
  375.         addSubView: bitView
  376.         window: (0 @ 0 extent: size)
  377.         viewport: (0 @ 0 extent: size).
  378.  
  379.     topView controller open! !
  380.  
  381. !NewBitEditorView class methodsFor: 'private'!
  382.  
  383. addFormSubViewsTo: aView
  384.     "Insert buttons and subviews into aView, appropriate for editing a Form"
  385.  
  386.     | button buttonView formView |
  387.     button _ Button newOff.
  388.     buttonView _ SwitchView new model: button.
  389.     button onAction: [aView model save].
  390.     buttonView label: 'save' asText allBold asParagraph asForm.
  391.     buttonView borderWidth: 2.
  392.     buttonView window: (buttonView defaultWindow origin
  393.             extent: (buttonView defaultWindow extent x @
  394.                 (buttonView defaultWindow extent y min: 
  395.                     (aView viewport extent y * 0.2)))).
  396.     aView
  397.         addSubView: buttonView
  398.         align: buttonView window center
  399.         with: aView viewport center x @ (aView viewport topCenter y +
  400.              (aView viewport height * 0.13)). 
  401.  
  402.     button _ Button newOff onAction: [aView model restore].
  403.     buttonView _ SwitchView new model: button.
  404.     buttonView borderWidth: 2.
  405.     buttonView label: 'undo' asText allBold asParagraph asForm.
  406.     buttonView window: (buttonView defaultWindow origin
  407.             extent: (buttonView defaultWindow extent x @
  408.                 (buttonView defaultWindow extent y min: 
  409.                     (aView viewport extent y * 0.2)))).
  410.     aView
  411.         addSubView: buttonView
  412.         align: buttonView window center
  413.         with: aView viewport center x @ (aView viewport topCenter y +
  414.              (aView viewport height * 0.35)).
  415.  
  416.     formView _ FormView new
  417.                     model: aView model backupForm
  418.                     controller: NoController new.
  419.     formView borderWidthLeft: 2 right: 0 top: 2 bottom: 0.
  420.     formView borderColor: Form black.
  421.     formView insideColor: Form white.
  422.     formView window: (formView defaultWindow expandBy: (2@2 extent: 2@2)).
  423.     aView addSubView: formView
  424.         align: formView window bottomRight
  425.         with: aView viewport bottomRight!
  426.  
  427. addOpaqueFormSubViewsTo: aView
  428.     "Insert buttons and subviews into aView, appropriate for editing
  429.      an OpaqueForm."
  430.  
  431.     | window button buttonView formView |
  432.     button _ Button newOff.
  433.     buttonView _ SwitchView new model: button.
  434.     button onAction: [aView model save].
  435.     buttonView label: 'save' asText allBold asParagraph asForm.
  436.     buttonView borderWidth: 2.
  437.     window _ buttonView defaultWindow origin
  438.             extent: (buttonView defaultWindow extent x @
  439.                 (buttonView defaultWindow extent y min: 
  440.                     (aView viewport extent y * 0.2))).
  441.     buttonView window: window.
  442.     aView
  443.         addSubView: buttonView
  444.         align: buttonView window rightCenter
  445.         with: (aView viewport center x  - 5) @ (aView viewport topCenter y +
  446.              (aView viewport height * 0.13)). 
  447.  
  448.     button _ Button newOff onAction: [aView model restore].
  449.     buttonView _ SwitchView new model: button.
  450.     buttonView borderWidth: 2.
  451.     buttonView label: 'undo' asText allBold asParagraph asForm.
  452.     buttonView window: window.
  453.     aView
  454.         addSubView: buttonView
  455.         align: buttonView window leftCenter
  456.         with: (aView viewport center x  + 5) @ (aView viewport topCenter y +
  457.              (aView viewport height * 0.13)). 
  458.  
  459.     button _ Button newOff.
  460.     buttonView _ SwitchView new model: button.
  461.     buttonView borderWidth: 2.
  462.     buttonView insideColor: Form white.
  463.     buttonView window: window.
  464.     button onAction: [
  465.         aView model yellowButtonColor: (aView model yellowButtonColor + 1 \\ 3).
  466.         aView model yellowButtonColor = 0 ifTrue: [
  467.                     buttonView insideColor: Form white].
  468.         aView model yellowButtonColor = 1 ifTrue: [
  469.                     buttonView insideColor: Form gray].
  470.         aView model yellowButtonColor = 2 ifTrue: [
  471.                     buttonView insideColor: Form veryLightGray]].
  472.     button offAction: [buttonView displayView].
  473.     aView
  474.         addSubView: buttonView
  475.         align: buttonView window leftCenter
  476.         with: (aView viewport center x  + 5) @ (aView viewport topCenter y +
  477.              (aView viewport height * 0.35)). 
  478.  
  479.     button _ Button newOff.
  480.     buttonView _ SwitchView new model: button.
  481.     buttonView borderWidth: 2.
  482.     buttonView insideColor: Form gray.
  483.     buttonView window: window.
  484.     button onAction: [
  485.         aView model redButtonColor: (aView model redButtonColor + 1 \\ 3).
  486.         aView model redButtonColor = 0 ifTrue: [
  487.                     buttonView insideColor: Form white].
  488.         aView model redButtonColor = 1 ifTrue: [
  489.                     buttonView insideColor: Form gray].
  490.         aView model redButtonColor = 2 ifTrue: [
  491.                     buttonView insideColor: Form veryLightGray]].
  492.     button offAction: [buttonView displayView].
  493.     aView
  494.         addSubView: buttonView
  495.         align: buttonView window rightCenter
  496.         with: (aView viewport center x  - 5) @ (aView viewport topCenter y +
  497.              (aView viewport height * 0.35)). 
  498.  
  499.     formView _ FormView new
  500.                     model: aView model backupForm
  501.                     controller: NoController new.
  502.     formView borderWidthLeft: 2 right: 0 top: 2 bottom: 0.
  503.     formView borderColor: Form black.
  504.     formView insideColor: Form white.
  505.     formView window: (formView defaultWindow expandBy: (2@2 extent: 2@2)).
  506.     aView addSubView: formView
  507.         align: formView window bottomRight
  508.         with: aView viewport bottomRight! !
  509.